package com.tscnd.core.utils;

import java.io.IOException;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.nio.charset.Charset;
import java.text.DateFormat;
import java.util.HashMap;
import java.util.Map;

import org.codehaus.jackson.JsonGenerationException;
import org.codehaus.jackson.map.JsonMappingException;

import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
/**
 * json 编解码工具类
 * @author xiejs
 * @createTime Jun 28, 2013
 */
public class JsonCodeUtils {
	private static final ObjectMappingCustomer objectMapper = new ObjectMappingCustomer();
	
	static {
		//设置消息格式
		objectMapper.setDateFormat(DateFormat.getDateTimeInstance());
	}
	/**
	 * 对象转json字符串
	 * @param <T> 对象类
	 * @param t 对象实例
	 * @return json字符串
	 */
	public static <T> String objectToJson(T t) {
		try {
			return objectMapper.writeValueAsString(t);
		} catch (JsonProcessingException e) {
			e.printStackTrace();
		} catch (JsonGenerationException e) {
			e.printStackTrace();
		} catch (JsonMappingException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}
		return null;
	}
	/**
	 * 对象转json字符串
	 * @param <T> 对象类
	 * @param t 对象实例
	 * @param charset 编码方式
	 * @return json字符串
	 */
	public static <T> String objectToJson(T t, Charset charset) {
		try {
			byte[] dataByte = objectMapper.writeValueAsBytes(t);
			return new String(dataByte, charset);
		} catch (JsonProcessingException e) {
			e.printStackTrace();
		} catch (JsonGenerationException e) {
			e.printStackTrace();
		} catch (JsonMappingException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}
		return null;
	}
	/**
	 * 对象转json字符串
	 * @param <T> 对象类
	 * @param t 对象实例
	 * @param dateFormat 消息格式化方式
	 * @return json字符串
	 */
	public static <T> String objectToJson(T t, DateFormat dateFormat) {
		ObjectMapper mapper = new ObjectMapper();
		mapper.setDateFormat(dateFormat);
		try {
			return mapper.writeValueAsString(t);
		} catch (JsonProcessingException e) {
			e.printStackTrace();
		}
		return null;
	}
	/**
	 * json字符串转对象
	 * @param <T> 对象类
	 * @param str json字符串
	 * @param c 对象Class
	 * @return 对象实例
	 */
	public static <T> T jsonToObject(String str, Class<T> c) {
		T t = null;
		try {
			t = objectMapper.readValue(str, c);
		} catch (JsonProcessingException e) {
			e.printStackTrace();
			return null;
		} catch (IOException e) {
			e.printStackTrace();
			return null;
		}
		return t;
	}
	/**
	 * map转对象
	 * @param map java.util.Map
	 * @param c 对象Class
	 * @return 对象实例
	 */
	public static <T> T mapToObject(Map<String,Object> map,Class<T> c){
		T t = null;
		try {
			t = objectMapper.readValue(map.toString(), c);
		} catch (JsonProcessingException e) {
			e.printStackTrace();
			return null;
		} catch (IOException e) {
			e.printStackTrace();
			return null;
		}
		return t;
	}
	
	/**
	 * 对象转map
	 * @param entity
	 * @return
	 */
	public static Map<String, Object> beanToMap(Object entity){  
        Map<String, Object> parameter = new HashMap<String, Object>();  
         Field[]   fields   =   entity.getClass().getDeclaredFields();  
        for(int i = 0; i < fields.length; i++){  
            String fieldName =  fields[i].getName();  
            Object o = null;  
            String firstLetter = fieldName.substring(0, 1).toUpperCase();  
               String getMethodName = "get" + firstLetter + fieldName.substring(1);  
               Method getMethod;  
            try {  
                getMethod = entity.getClass().getMethod(getMethodName, new Class[] {});  
                 o = getMethod.invoke(entity, new Object[] {});  
            } catch (Exception e) {  
                e.printStackTrace();  
            }    
            if(o != null){  
                parameter.put(fieldName, o);  
            }  
        }  
        return parameter;  
    }  
	
}